package leetcode.day;

import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.Deque;
import java.util.List;

// 71. 简化路径
public class SimplifyPath {
    /**
     * 测试双队列
     *
     * @param args
     */
    public static void main(String[] args) {
        // 可以在队首加，也可以在队尾加，可以指定移除队尾的，也可指定移除队首的
        Deque<String> stack = new ArrayDeque<>();
        stack.add("a");
        stack.add("b");
        stack.add("c");
        stack.add("d");
        // 先进先出
        stack.remove();
        System.out.println(stack);
        stack.offerFirst("e1");
        stack.offerLast("e2");
        System.out.println(stack);
        stack.removeLast();

        System.out.println(stack);
    }

    public String simplifyPath(String path) {
        String[] strings = path.split("/");
        // 双队列，这里采用双队列的原因是，后面拼接字符串的时候需要将栈内元素从栈底到栈顶拼接，
        // 如果直接用栈，那么还得翻转
        Deque<String> stack = new ArrayDeque<>();
        for (String s : strings) {
            //如果是空值，或者是"."，那么就跳过，因为"."就表示当前目录，空值说明连着俩//，
            if (s.length() == 0 || ".".equals(s)) {
                continue;
            } else if ("..".equals(s)) {
                //如果是两个点,那么就返回到上一级，也就是栈顶元素出栈
                if (!stack.isEmpty()) {
                    stack.pollLast();
                }
            } else {
                // 如果是目录名，就让其进栈
                stack.offerLast(s);
            }
        }
        StringBuilder sb = new StringBuilder();
        if (stack.isEmpty()) {
            sb.append("/");
        } else {
            while (!stack.isEmpty()) {
                sb.append("/");
                sb.append(stack.pollFirst());
            }
        }
        return sb.toString();
    }


    // 简洁版
    public String simplifyPath2(String path) {
        List<String> list = Arrays.asList("", ".", "..");
        String[] strings = path.split("/");
        Deque<String> deque = new ArrayDeque<>();
        for (String s : strings) {
            if (!list.contains(s)) {
                deque.add(s);
            } else if (!deque.isEmpty() && "..".equals(s)) {
                deque.pollLast();
            }
        }
        return "/" + String.join("/", deque);
    }
}
